home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 February / PCWFEB09.iso / Software / Linux / Kubuntu 8.10 / kubuntu-8.10-desktop-i386.iso / casper / filesystem.squashfs / var / lib / dpkg / info / x11-common.postrm < prev    next >
Text File  |  2008-10-24  |  34KB  |  1,021 lines

  1. #!/bin/sh
  2. # Debian x11-common package post-removal script
  3. # Copyright 1998--2001, 2003 Branden Robinson.
  4. # Licensed under the GNU General Public License, version 2.  See the file
  5. # /usr/share/common-licenses/GPL or <http://www.gnu.org/copyleft/gpl.txt>.
  6. # Acknowlegements to Stephen Early, Mark Eichin, and Manoj Srivastava.
  7.  
  8.  
  9. set -e
  10.  
  11. THIS_PACKAGE=x11-common
  12. THIS_SCRIPT=postrm
  13. CONFIG_DIR=/etc/X11
  14. XWRAPPER_CONFIG="$CONFIG_DIR/Xwrapper.config"
  15. CONFIG_AUX_DIR=/var/lib/x11
  16. XWRAPPER_CONFIG_CHECKSUM="$CONFIG_AUX_DIR/${XWRAPPER_CONFIG##*/}.md5sum"
  17. XWRAPPER_CONFIG_ROSTER="$CONFIG_AUX_DIR/${XWRAPPER_CONFIG##*/}.roster"
  18.  
  19. # $Id$
  20.  
  21. # This is the X Strike Force shell library for X Window System package
  22. # maintainer scripts.  It serves to define shell functions commonly used by
  23. # such packages, and performs some error checking necessary for proper operation
  24. # of those functions.  By itself, it does not "do" much; the maintainer scripts
  25. # invoke the functions defined here to accomplish package installation and
  26. # removal tasks.
  27.  
  28. # If you are reading this within a Debian package maintainer script (e.g.,
  29. # /var/lib/dpkg)info/PACKAGE.{config,preinst,postinst,prerm,postrm}), you can
  30. # skip past this library by scanning forward in this file to the string
  31. # "GOBSTOPPER".
  32.  
  33. SOURCE_VERSION=1:7.4~5ubuntu3
  34. OFFICIAL_BUILD=
  35.  
  36. # Use special abnormal exit codes so that problems with this library are more
  37. # easily tracked down.
  38. SHELL_LIB_INTERNAL_ERROR=86
  39. SHELL_LIB_THROWN_ERROR=74
  40. SHELL_LIB_USAGE_ERROR=99
  41.  
  42. # old -> new variable names
  43. if [ -z "$DEBUG_XORG_PACKAGE" ] && [ -n "$DEBUG_XFREE86_PACKAGE" ]; then
  44.   DEBUG_XORG_PACKAGE="$DEBUG_XFREE86_PACKAGE"
  45. fi
  46. if [ -z "$DEBUG_XORG_DEBCONF" ] && [ -n "$DEBUG_XFREE86_DEBCONF" ]; then
  47.   DEBUG_XORG_DEBCONF="$DEBUG_XFREE86_DEBCONF"
  48. fi
  49.  
  50. # initial sanity checks
  51. if [ -z "$THIS_PACKAGE" ]; then
  52.   cat >&2 <<EOF
  53. Error: package maintainer script attempted to use shell library without
  54. definining \$THIS_PACKAGE shell variable.  Please report the package name,
  55. version, and the text of this error message to the Debian Bug Tracking System.
  56. Visit <http://www.debian.org/Bugs/Reporting> on the World Wide Web for
  57. instructions, read the file /usr/share/doc/debian/bug-reporting.txt from the
  58. "doc-debian" package, or install the "reportbug" package and use the command of
  59. the same name to file a report against version $SOURCE_VERSION of this package.
  60. EOF
  61.   exit $SHELL_LIB_USAGE_ERROR
  62. fi
  63.  
  64. if [ -z "$THIS_SCRIPT" ]; then
  65.   cat >&2 <<EOF
  66. Error: package maintainer script attempted to use shell library without
  67. definining \$THIS_SCRIPT shell variable.  Please report the package name,
  68. version, and the text of this error message to the Debian Bug Tracking System.
  69. Visit <http://www.debian.org/Bugs/Reporting> on the World Wide Web for
  70. instructions, read the file /usr/share/doc/debian/bug-reporting.txt from the
  71. "doc-debian" package, or install the "reportbug" package and use the command of
  72. the same name to file a report against version $SOURCE_VERSION of the
  73. "$THIS_PACKAGE" package.
  74. EOF
  75.   exit $SHELL_LIB_USAGE_ERROR
  76. fi
  77.  
  78. ARCHITECTURE="$(dpkg --print-installation-architecture)"
  79.  
  80. if [ "$1" = "reconfigure" ] || [ -n "$DEBCONF_RECONFIGURE" ]; then
  81.   RECONFIGURE="true"
  82. else
  83.   RECONFIGURE=
  84. fi
  85.  
  86. if ([ "$1" = "install" ] || [ "$1" = "configure" ]) && [ -z "$2" ]; then
  87.   FIRSTINST="yes"
  88. fi
  89.  
  90. if [ -z "$RECONFIGURE" ] && [ -z "$FIRSTINST" ]; then
  91.   UPGRADE="yes"
  92. fi
  93.  
  94. trap "message;\
  95.       message \"Received signal.  Aborting $THIS_PACKAGE package $THIS_SCRIPT script.\";\
  96.       message;\
  97.       exit 1" HUP INT QUIT TERM
  98.  
  99. reject_nondigits () {
  100.   # syntax: reject_nondigits [ operand ... ]
  101.   #
  102.   # scan operands (typically shell variables whose values cannot be trusted) for
  103.   # characters other than decimal digits and barf if any are found
  104.   while [ -n "$1" ]; do
  105.     # does the operand contain anything but digits?
  106.     if ! expr "$1" : "[[:digit:]]\+$" > /dev/null 2>&1; then
  107.       # can't use die(), because it wraps message() which wraps this function
  108.       echo "$THIS_PACKAGE $THIS_SCRIPT error: reject_nondigits() encountered" \
  109.            "possibly malicious garbage \"$1\"" >&2
  110.       exit $SHELL_LIB_THROWN_ERROR
  111.     fi
  112.     shift
  113.   done
  114. }
  115.  
  116. reject_whitespace () {
  117.   # syntax: reject_whitespace [ operand ]
  118.   #
  119.   # scan operand (typically a shell variable whose value cannot be trusted) for
  120.   # whitespace characters and barf if any are found
  121.   if [ -n "$1" ]; then
  122.     # does the operand contain any whitespace?
  123.     if expr "$1" : "[[:space:]]" > /dev/null 2>&1; then
  124.       # can't use die(), because I want to avoid forward references
  125.       echo "$THIS_PACKAGE $THIS_SCRIPT error: reject_whitespace() encountered" \
  126.            "possibly malicious garbage \"$1\"" >&2
  127.       exit $SHELL_LIB_THROWN_ERROR
  128.     fi
  129.   fi
  130. }
  131.  
  132. reject_unlikely_path_chars () {
  133.   # syntax: reject_unlikely_path_chars [ operand ... ]
  134.   #
  135.   # scan operands (typically shell variables whose values cannot be trusted) for
  136.   # characters unlikely to be seen in a path and which the shell might
  137.   # interpret and barf if any are found
  138.   while [ -n "$1" ]; do
  139.     # does the operand contain any funny characters?
  140.     if expr "$1" : '.*[!$&()*;<>?|].*' > /dev/null 2>&1; then
  141.       # can't use die(), because I want to avoid forward references
  142.       echo "$THIS_PACKAGE $THIS_SCRIPT error: reject_unlikely_path_chars()" \
  143.            "encountered possibly malicious garbage \"$1\"" >&2
  144.       exit $SHELL_LIB_THROWN_ERROR
  145.     fi
  146.     shift
  147.   done
  148. }
  149.  
  150. # Query the terminal to establish a default number of columns to use for
  151. # displaying messages to the user.  This is used only as a fallback in the
  152. # event the COLUMNS variable is not set.  ($COLUMNS can react to SIGWINCH while
  153. # the script is running, and this cannot, only being calculated once.)
  154. DEFCOLUMNS=$(stty size 2> /dev/null | awk '{print $2}') || true
  155. if ! expr "$DEFCOLUMNS" : "[[:digit:]]\+$" > /dev/null 2>&1; then
  156.   DEFCOLUMNS=80
  157. fi
  158.  
  159. message () {
  160.   # pretty-print messages of arbitrary length
  161.   reject_nondigits "$COLUMNS"
  162.   echo "$*" | fmt -t -w ${COLUMNS:-$DEFCOLUMNS} >&2
  163. }
  164.  
  165. observe () {
  166.   # syntax: observe message ...
  167.   #
  168.   # issue observational message suitable for logging someday when support for
  169.   # it exists in dpkg
  170.   if [ -n "$DEBUG_XORG_PACKAGE" ]; then
  171.     message "$THIS_PACKAGE $THIS_SCRIPT note: $*"
  172.   fi
  173. }
  174.  
  175. warn () {
  176.   # syntax: warn message ...
  177.   #
  178.   # issue warning message suitable for logging someday when support for
  179.   # it exists in dpkg; also send to standard error
  180.   message "$THIS_PACKAGE $THIS_SCRIPT warning: $*"
  181. }
  182.  
  183. die () {
  184.   # syntax: die message ...
  185.   #
  186.   # exit script with error message
  187.   message "$THIS_PACKAGE $THIS_SCRIPT error: $*"
  188.   exit $SHELL_LIB_THROWN_ERROR
  189. }
  190.  
  191. internal_error () {
  192.   # exit script with error; essentially a "THIS SHOULD NEVER HAPPEN" message
  193.   message "internal error: $*"
  194.   if [ -n "$OFFICIAL_BUILD" ]; then
  195.     message "Please report a bug in the $THIS_SCRIPT script of the" \
  196.             "$THIS_PACKAGE package, version $SOURCE_VERSION to the Debian Bug" \
  197.             "Tracking System.  Include all messages above that mention the" \
  198.             "$THIS_PACKAGE package.  Visit " \
  199.             "<http://www.debian.org/Bugs/Reporting> on the World Wide Web for" \
  200.             "instructions, read the file" \
  201.             "/usr/share/doc/debian/bug-reporting.txt from the doc-debian" \
  202.             "package, or install the reportbug package and use the command of" \
  203.             "the same name to file a report."
  204.   fi
  205.   exit $SHELL_LIB_INTERNAL_ERROR
  206. }
  207.  
  208. usage_error () {
  209.   message "usage error: $*"
  210.   message "Please report a bug in the $THIS_SCRIPT script of the" \
  211.           "$THIS_PACKAGE package, version $SOURCE_VERSION to the Debian Bug" \
  212.           "Tracking System.  Include all messages above that mention the" \
  213.           "$THIS_PACKAGE package.  Visit " \
  214.           "<http://www.debian.org/Bugs/Reporting> on the World Wide Web for" \
  215.           "instructions, read the file" \
  216.           "/usr/share/doc/debian/bug-reporting.txt from the doc-debian" \
  217.           "package, or install the reportbug package and use the command of" \
  218.           "the same name to file a report."
  219.   exit $SHELL_LIB_USAGE_ERROR
  220. }
  221.  
  222.  
  223. maplink () {
  224.   # returns what symlink should point to; i.e., what the "sane" answer is
  225.   # Keep this in sync with the debian/*.links files.
  226.   # This is only needed for symlinks to directories.
  227.   #
  228.   # XXX: Most of these look wrong in the X11R7 world and need to be fixed.
  229.   # If we've stopped using this function, fixing it might enable us to re-enable
  230.   # it again and catch more errors.
  231.   case "$1" in
  232.     /etc/X11/xkb/compiled) echo /var/lib/xkb ;;
  233.     /etc/X11/xkb/xkbcomp) echo /usr/X11R6/bin/xkbcomp ;;
  234.     /usr/X11R6/lib/X11/app-defaults) echo /etc/X11/app-defaults ;;
  235.     /usr/X11R6/lib/X11/fs) echo /etc/X11/fs ;;
  236.     /usr/X11R6/lib/X11/lbxproxy) echo /etc/X11/lbxproxy ;;
  237.     /usr/X11R6/lib/X11/proxymngr) echo /etc/X11/proxymngr ;;
  238.     /usr/X11R6/lib/X11/rstart) echo /etc/X11/rstart ;;
  239.     /usr/X11R6/lib/X11/twm) echo /etc/X11/twm ;;
  240.     /usr/X11R6/lib/X11/xdm) echo /etc/X11/xdm ;;
  241.     /usr/X11R6/lib/X11/xinit) echo /etc/X11/xinit ;;
  242.     /usr/X11R6/lib/X11/xkb) echo /etc/X11/xkb ;;
  243.     /usr/X11R6/lib/X11/xserver) echo /etc/X11/xserver ;;
  244.     /usr/X11R6/lib/X11/xsm) echo /etc/X11/xsm ;;
  245.     /usr/bin/X11) echo ../X11R6/bin ;;
  246.     /usr/bin/rstartd) echo ../X11R6/bin/rstartd ;;
  247.     /usr/include/X11) echo ../X11R6/include/X11 ;;
  248.     /usr/lib/X11) echo ../X11R6/lib/X11 ;;
  249.     *) internal_error "maplink() called with unknown path \"$1\"" ;;
  250.   esac
  251. }
  252.  
  253. analyze_path () {
  254.   # given a supplied set of pathnames, break each one up by directory and do an
  255.   # ls -dl on each component, cumulatively; i.e.
  256.   # analyze_path /usr/X11R6/bin -> ls -dl /usr /usr/X11R6 /usr/X11R6/bin
  257.   # Thanks to Randolph Chung for this clever hack.
  258.  
  259.   local f g
  260.  
  261.   while [ -n "$1" ]; do
  262.     reject_whitespace "$1"
  263.     g=
  264.     message "Analyzing $1:"
  265.     for f in $(echo "$1" | tr / \  ); do
  266.       if [ -e /$g$f ]; then
  267.         ls -dl /$g$f /$g$f.dpkg-* 2> /dev/null || true
  268.         g=$g$f/
  269.       else
  270.         message "/$g$f: nonexistent; directory contents of /$g:"
  271.         ls -l /$g
  272.         break
  273.       fi
  274.     done
  275.     shift
  276.   done
  277. }
  278.  
  279. find_culprits () {
  280.   local f p dpkg_info_dir possible_culprits smoking_guns bad_packages package \
  281.     msg
  282.  
  283.   reject_whitespace "$1"
  284.   message "Searching for overlapping packages..."
  285.   dpkg_info_dir=/var/lib/dpkg/info
  286.   if [ -d $dpkg_info_dir ]; then
  287.     if [ "$(echo $dpkg_info_dir/*.list)" != "$dpkg_info_dir/*.list" ]; then
  288.       possible_culprits=$(ls -1 $dpkg_info_dir/*.list | egrep -v \
  289.         "(xbase-clients|x11-common|xfs|xlibs)")
  290.       if [ -n "$possible_culprits" ]; then
  291.         smoking_guns=$(grep -l "$1" $possible_culprits || true)
  292.         if [ -n "$smoking_guns" ]; then
  293.           bad_packages=$(printf "\\n")
  294.           for f in $smoking_guns; do
  295.             # too bad you can't nest parameter expansion voodoo
  296.             p=${f%*.list}      # strip off the trailing ".list"
  297.             package=${p##*/}   # strip off the directories
  298.             bad_packages=$(printf "%s\n%s" "$bad_packages" "$package")
  299.           done
  300.           msg=$(cat <<EOF
  301. The following packages appear to have file overlaps with the X.Org packages;
  302. these packages are either very old, or in violation of Debian Policy.  Try
  303. upgrading each of these packages to the latest available version if possible:
  304. for example, with the command "apt-get install".  If no newer version of a
  305. package is available, you will have to remove it; for example, with the command
  306. "apt-get remove".  If even the latest available version of the package has
  307. this file overlap, please file a bug against that package with the Debian Bug
  308. Tracking System.  You may want to refer the package maintainer to section 12.8
  309. of the Debian Policy manual.
  310. EOF
  311. )
  312.           message "$msg"
  313.           message "The overlapping packages are: $bad_packages"
  314.         else
  315.           message "no overlaps found."
  316.         fi
  317.       fi
  318.     else
  319.       message "cannot search; no matches for $dpkg_info_dir/*.list."
  320.     fi
  321.   else
  322.     message "cannot search; $dpkg_info_dir does not exist."
  323.   fi
  324. }
  325.  
  326. # we require a readlink command or shell function
  327. if ! which readlink > /dev/null 2>&1; then
  328.   message "The readlink command was not found.  Please install version" \
  329.           "1.13.1 or later of the debianutils package."
  330.   readlink () {
  331.     # returns what symlink in $1 actually points to
  332.     perl -e '$l = shift; exit 1 unless -l $l; $r = readlink $l; exit 1 unless $r; print "$r\n"' "$1"
  333.   }
  334. fi
  335.  
  336. check_symlink () {
  337.   # syntax: check_symlink symlink
  338.   #
  339.   # See if specified symlink points where it is supposed to.  Return 0 if it
  340.   # does, and 1 if it does not.
  341.   #
  342.   # Primarily used by check_symlinks_and_warn() and check_symlinks_and_bomb().
  343.  
  344.   local symlink
  345.  
  346.   # validate arguments
  347.   if [ $# -ne 1 ]; then
  348.     usage_error "check_symlink() called with wrong number of arguments;" \
  349.                 "expected 1, got $#"
  350.     exit $SHELL_LIB_USAGE_ERROR
  351.   fi
  352.  
  353.   symlink="$1"
  354.  
  355.   if [ "$(maplink "$symlink")" = "$(readlink "$symlink")" ]; then
  356.     return 0
  357.   else
  358.     return 1
  359.   fi
  360. }
  361.  
  362. check_symlinks_and_warn () {
  363.   # syntax: check_symlinks_and_warn symlink ...
  364.   #
  365.   # For each argument, check for symlink sanity, and warn if it isn't sane.
  366.   #
  367.   # Call this function from a preinst script in the event $1 is "upgrade" or
  368.   # "install".
  369.  
  370.   local errmsg symlink
  371.  
  372.   # validate arguments
  373.   if [ $# -lt 1 ]; then
  374.     usage_error "check_symlinks_and_warn() called with wrong number of" \
  375.                 "arguments; expected at least 1, got $#"
  376.     exit $SHELL_LIB_USAGE_ERROR
  377.   fi
  378.  
  379.   while [ -n "$1" ]; do
  380.     symlink="$1"
  381.     if [ -L "$symlink" ]; then
  382.       if ! check_symlink "$symlink"; then
  383.         observe "$symlink symbolic link points to wrong location" \
  384.                 "$(readlink "$symlink"); removing"
  385.         rm "$symlink"
  386.       fi
  387.     elif [ -e "$symlink" ]; then
  388.       errmsg="$symlink exists and is not a symbolic link; this package cannot"
  389.       errmsg="$errmsg be installed until this"
  390.       if [ -f "$symlink" ]; then
  391.         errmsg="$errmsg file"
  392.       elif [ -d "$symlink" ]; then
  393.         errmsg="$errmsg directory"
  394.       else
  395.         errmsg="$errmsg thing"
  396.       fi
  397.       errmsg="$errmsg is removed"
  398.       die "$errmsg"
  399.     fi
  400.     shift
  401.   done
  402. }
  403.  
  404. check_symlinks_and_bomb () {
  405.   # syntax: check_symlinks_and_bomb symlink ...
  406.   #
  407.   # For each argument, check for symlink sanity, and bomb if it isn't sane.
  408.   #
  409.   # Call this function from a postinst script.
  410.  
  411.   local problem symlink
  412.  
  413.   # validate arguments
  414.   if [ $# -lt 1 ]; then
  415.     usage_error "check_symlinks_and_bomb() called with wrong number of"
  416.                 "arguments; expected at least 1, got $#"
  417.     exit $SHELL_LIB_USAGE_ERROR
  418.   fi
  419.  
  420.   while [ -n "$1" ]; do
  421.     problem=
  422.     symlink="$1"
  423.     if [ -L "$symlink" ]; then
  424.       if ! check_symlink "$symlink"; then
  425.         problem=yes
  426.         warn "$symlink symbolic link points to wrong location" \
  427.              "$(readlink "$symlink")"
  428.       fi
  429.     elif [ -e "$symlink" ]; then
  430.       problem=yes
  431.       warn "$symlink is not a symbolic link"
  432.     else
  433.       problem=yes
  434.       warn "$symlink symbolic link does not exist"
  435.     fi
  436.     if [ -n "$problem" ]; then
  437.       analyze_path "$symlink" "$(readlink "$symlink")"
  438.       find_culprits "$symlink"
  439.       die "bad symbolic links on system"
  440.     fi
  441.     shift
  442.   done
  443. }
  444.  
  445. font_update () {
  446.   # run $UPDATECMDS in $FONTDIRS
  447.  
  448.   local dir cmd shortcmd x_font_dir_prefix
  449.  
  450.   x_font_dir_prefix="/usr/share/fonts/X11"
  451.  
  452.   if [ -z "$UPDATECMDS" ]; then
  453.     usage_error "font_update() called but \$UPDATECMDS not set"
  454.   fi
  455.   if [ -z "$FONTDIRS" ]; then
  456.     usage_error "font_update() called but \$FONTDIRS not set"
  457.   fi
  458.  
  459.   reject_unlikely_path_chars "$UPDATECMDS"
  460.   reject_unlikely_path_chars "$FONTDIRS"
  461.  
  462.   for dir in $FONTDIRS; do
  463.     if [ -d "$x_font_dir_prefix/$dir" ]; then
  464.       for cmd in $UPDATECMDS; do
  465.         if which "$cmd" > /dev/null 2>&1; then
  466.           shortcmd=${cmd##*/}
  467.           observe "running $shortcmd in $dir font directory"
  468.       cmd_opts=
  469.           if [ "$shortcmd" = "update-fonts-alias" ]; then
  470.             cmd_opts=--x11r7-layout
  471.           fi
  472.           if [ "$shortcmd" = "update-fonts-dir" ]; then
  473.             cmd_opts=--x11r7-layout
  474.           fi
  475.           if [ "$shortcmd" = "update-fonts-scale" ]; then
  476.             cmd_opts=--x11r7-layout
  477.           fi
  478.           $cmd $cmd_opts $dir || warn "$cmd $cmd_opts $dir" \
  479.                               "failed; font directory data may not" \
  480.                               "be up to date"
  481.         else
  482.           warn "$cmd not found; not updating corresponding $dir font" \
  483.                "directory data"
  484.         fi
  485.       done
  486.     else
  487.       warn "$dir is not a directory; not updating font directory data"
  488.     fi
  489.   done
  490. }
  491.  
  492. remove_conffile_prepare () {
  493.   # syntax: remove_conffile_prepare filename official_md5sum ...
  494.   #
  495.   # Check a conffile "filename" against a list of canonical MD5 checksums.
  496.   # If the file's current MD5 checksum matches one of the "official_md5sum"
  497.   # operands provided, then prepare the conffile for removal from the system.
  498.   # We defer actual deletion until the package is configured so that we can
  499.   # roll this operation back if package installation fails.
  500.   #
  501.   # Call this function from a preinst script in the event $1 is "upgrade" or
  502.   # "install" and verify $2 to ensure the package is being upgraded from a
  503.   # version (or installed over a version removed-but-not-purged) prior to the
  504.   # one in which the conffile was obsoleted.
  505.  
  506.   local conffile current_checksum
  507.  
  508.   # validate arguments
  509.   if [ $# -lt 2 ]; then
  510.     usage_error "remove_conffile_prepare() called with wrong number of" \
  511.                 "arguments; expected at least 2, got $#"
  512.     exit $SHELL_LIB_USAGE_ERROR
  513.   fi
  514.  
  515.   conffile="$1"
  516.   shift
  517.  
  518.   # does the conffile even exist?
  519.   if [ -e "$conffile" ]; then
  520.     # calculate its checksum
  521.     current_checksum=$(md5sum < "$conffile" | sed 's/[[:space:]].*//')
  522.     # compare it to each supplied checksum
  523.     while [ -n "$1" ]; do
  524.       if [ "$current_checksum" = "$1" ]; then
  525.         # we found a match; move the confffile and stop looking
  526.         observe "preparing obsolete conffile $conffile for removal"
  527.         mv "$conffile" "$conffile.$THIS_PACKAGE-tmp"
  528.         break
  529.       fi
  530.       shift
  531.     done
  532.   fi
  533. }
  534.  
  535. remove_conffile_lookup () {
  536.   # syntax: remove_conffile_lookup package filename
  537.   #
  538.   # Lookup the md5sum of a conffile in dpkg's database, and prepare for removal
  539.   # if it matches the actual file's md5sum.
  540.   #
  541.   # Call this function when you would call remove_conffile_prepare but only
  542.   # want to check against dpkg's status database instead of known checksums.
  543.  
  544.   local package conffile old_md5sum
  545.  
  546.   # validate arguments
  547.   if [ $# -ne 2 ]; then
  548.     usage_error "remove_conffile_lookup() called with wrong number of" \
  549.                 "arguments; expected 1, got $#"
  550.     exit $SHELL_LIB_USAGE_ERROR
  551.   fi
  552.  
  553.   package="$1"
  554.   conffile="$2"
  555.  
  556.   if ! [ -e "$conffile" ]; then
  557.     return
  558.   fi
  559.   old_md5sum="$(dpkg-query -W -f='${Conffiles}' "$package" | \
  560.     awk '{ if (match($0, "^ '"$conffile"' ")) print $2}')"
  561.   if [ -n "$old_md5sum" ]; then
  562.     remove_conffile_prepare "$conffile" "$old_md5sum"
  563.   fi
  564. }
  565.  
  566. remove_conffile_commit () {
  567.   # syntax: remove_conffile_commit filename
  568.   #
  569.   # Complete the removal of a conffile "filename" that has become obsolete.
  570.   #
  571.   # Call this function from a postinst script after having used
  572.   # remove_conffile_prepare() in the preinst.
  573.  
  574.   local conffile
  575.  
  576.   # validate arguments
  577.   if [ $# -ne 1 ]; then
  578.     usage_error "remove_conffile_commit() called with wrong number of" \
  579.                 "arguments; expected 1, got $#"
  580.     exit $SHELL_LIB_USAGE_ERROR
  581.   fi
  582.  
  583.   conffile="$1"
  584.  
  585.   # if the temporary file created by remove_conffile_prepare() exists, remove it
  586.   if [ -e "$conffile.$THIS_PACKAGE-tmp" ]; then
  587.     observe "committing removal of obsolete conffile $conffile"
  588.     rm "$conffile.$THIS_PACKAGE-tmp"
  589.   fi
  590. }
  591.  
  592. remove_conffile_rollback () {
  593.   # syntax: remove_conffile_rollback filename
  594.   #
  595.   # Roll back the removal of a conffile "filename".
  596.   #
  597.   # Call this function from a postrm script in the event $1 is "abort-upgrade"
  598.   # or "abort-install" is  after having used remove_conffile_prepare() in the
  599.   # preinst.
  600.  
  601.   local conffile
  602.  
  603.   # validate arguments
  604.   if [ $# -ne 1 ]; then
  605.     usage_error "remove_conffile_rollback() called with wrong number of" \
  606.                 "arguments; expected 1, got $#"
  607.     exit $SHELL_LIB_USAGE_ERROR
  608.   fi
  609.  
  610.   conffile="$1"
  611.  
  612.   # if the temporary file created by remove_conffile_prepare() exists, move it
  613.   # back
  614.   if [ -e "$conffile.$THIS_PACKAGE-tmp" ]; then
  615.     observe "rolling back removal of obsolete conffile $conffile"
  616.     mv "$conffile.$THIS_PACKAGE-tmp" "$conffile"
  617.   fi
  618. }
  619.  
  620. replace_conffile_with_symlink_prepare () {
  621.   # syntax: replace_conffile_with_symlink_prepare oldfilename newfilename \
  622.   # official_md5sum ...
  623.   #
  624.   # Check a conffile "oldfilename" against a list of canonical MD5 checksums.
  625.   # If the file's current MD5 checksum matches one of the "official_md5sum"
  626.   # operands provided, then prepare the conffile for removal from the system.
  627.   # We defer actual deletion until the package is configured so that we can
  628.   # roll this operation back if package installation fails. Otherwise copy it
  629.   # to newfilename and let dpkg handle it through conffiles mechanism.
  630.   #
  631.   # Call this function from a preinst script in the event $1 is "upgrade" or
  632.   # "install" and verify $2 to ensure the package is being upgraded from a
  633.   # version (or installed over a version removed-but-not-purged) prior to the
  634.   # one in which the conffile was obsoleted.
  635.  
  636.   local conffile current_checksum
  637.  
  638.   # validate arguments
  639.   if [ $# -lt 3 ]; then
  640.     usage_error "replace_conffile_with_symlink_prepare() called with wrong" \
  641.                 " number of arguments; expected at least 3, got $#"
  642.     exit $SHELL_LIB_USAGE_ERROR
  643.   fi
  644.  
  645.   oldconffile="$1"
  646.   shift
  647.   newconffile="$1"
  648.   shift
  649.  
  650.   remove_conffile_prepare "$_oldconffile" "$@"
  651.   # If $oldconffile still exists, then md5sums didn't match.
  652.   # Copy it to new one.
  653.   if [ -f "$oldconffile" ]; then
  654.     cp "$oldconffile" "$newconffile"
  655.   fi
  656.  
  657. }
  658.  
  659. replace_conffile_with_symlink_commit () {
  660.   # syntax: replace_conffile_with_symlink_commit oldfilename
  661.   #
  662.   # Complete the removal of a conffile "oldfilename" that has been
  663.   # replaced by a symlink.
  664.   #
  665.   # Call this function from a postinst script after having used
  666.   # replace_conffile_with_symlink_prepare() in the preinst.
  667.  
  668.   local conffile
  669.  
  670.   # validate arguments
  671.   if [ $# -ne 1 ]; then
  672.     usage_error "replace_conffile_with_symlink_commit() called with wrong" \
  673.                 "number of arguments; expected 1, got $#"
  674.     exit $SHELL_LIB_USAGE_ERROR
  675.   fi
  676.  
  677.   conffile="$1"
  678.  
  679.   remove_conffile_commit "$conffile"
  680. }
  681.  
  682. replace_conffile_with_symlink_rollback () {
  683.   # syntax: replace_conffile_with_symlink_rollback oldfilename newfilename
  684.   #
  685.   # Roll back the replacing of a conffile "oldfilename" with symlink to
  686.   # "newfilename".
  687.   #
  688.   # Call this function from a postrm script in the event $1 is "abort-upgrade"
  689.   # or "abort-install" and verify $2 to ensure the package failed to upgrade
  690.   # from a version (or install over a version removed-but-not-purged) prior
  691.   # to the one in which the conffile was obsoleted.
  692.   # You should have  used replace_conffile_with_symlink_prepare() in the
  693.   # preinst.
  694.  
  695.   local conffile
  696.  
  697.   # validate arguments
  698.   if [ $# -ne 2 ]; then
  699.     usage_error "replace_conffile_with_symlink_rollback() called with wrong" \
  700.                 "number of arguments; expected 2, got $#"
  701.     exit $SHELL_LIB_USAGE_ERROR
  702.   fi
  703.  
  704.   oldconffile="$1"
  705.   newconffile="$2"
  706.  
  707.   remove_conffile_rollback "$_oldconffile"
  708.   if [ -f "$newconffile" ]; then
  709.     rm "$newconffile"
  710.   fi
  711. }
  712.  
  713. run () {
  714.   # syntax: run command [ argument ... ]
  715.   #
  716.   # Run specified command with optional arguments and report its exit status.
  717.   # Useful for commands whose exit status may be nonzero, but still acceptable,
  718.   # or commands whose failure is not fatal to us.
  719.   #
  720.   # NOTE: Do *not* use this function with db_get or db_metaget commands; in
  721.   # those cases the return value of the debconf command *must* be checked
  722.   # before the string returned by debconf is used for anything.
  723.  
  724.   local retval
  725.  
  726.   # validate arguments
  727.   if [ $# -lt 1 ]; then
  728.     usage_error "run() called with wrong number of arguments; expected at" \
  729.                 "least 1, got $#"
  730.     exit $SHELL_LIB_USAGE_ERROR
  731.   fi
  732.  
  733.   "$@" || retval=$?
  734.  
  735.   if [ ${retval:-0} -ne 0 ]; then
  736.     observe "command \"$*\" exited with status $retval"
  737.   fi
  738. }
  739.  
  740. register_x_lib_dir_with_ld_so () {
  741.   # syntax: register_x_lib_dir_with_ld_so
  742.   #
  743.   # Configure the dynamic loader ld.so to search /usr/X11R6/lib for shared
  744.   # libraries.
  745.   #
  746.   # Call this function from the postinst script of a package that places a
  747.   # shared library in /usr/X11R6/lib, before invoking ldconfig.
  748.  
  749.   local dir ldsoconf
  750.  
  751.   dir="/usr/X11R6/lib"
  752.   ldsoconf="/etc/ld.so.conf"
  753.  
  754.   # is the line not already present?
  755.   if ! fgrep -qsx "$dir" "$ldsoconf"; then
  756.     observe "adding $dir directory to $ldsoconf"
  757.     echo "$dir" >> "$ldsoconf"
  758.   fi
  759. }
  760.  
  761. deregister_x_lib_dir_with_ld_so () {
  762.   # syntax: deregister_x_lib_dir_with_ld_so
  763.   #
  764.   # Configure dynamic loader ld.so to not search /usr/X11R6/lib for shared
  765.   # libraries, if and only if no shared libaries remain there.
  766.   #
  767.   # Call this function from the postrm script of a package that places a shared
  768.   # library in /usr/X11R6/lib, in the event "$1" is "remove", and before
  769.   # invoking ldconfig.
  770.  
  771.   local dir ldsoconf fgrep_status cmp_status
  772.  
  773.   dir="/usr/X11R6/lib"
  774.   ldsoconf="/etc/ld.so.conf"
  775.  
  776.   # is the line present?
  777.   if fgrep -qsx "$dir" "$ldsoconf"; then
  778.     # are there any shared objects in the directory?
  779.     if [ "$(echo "$dir"/lib*.so.*.*)" = "$dir/lib*.so.*.*" ]; then
  780.       # glob expansion produced nothing, so no shared libraries are present
  781.       observe "removing $dir directory from $ldsoconf"
  782.       # rewrite the file (very carefully)
  783.       set +e
  784.       fgrep -svx "$dir" "$ldsoconf" > "$ldsoconf.dpkg-tmp"
  785.       fgrep_status=$?
  786.       set -e
  787.       case $fgrep_status in
  788.         0|1) ;; # we don't actually care if any lines matched or not
  789.         *) die "error reading \"$ldsoconf\"; fgrep exited with status" \
  790.           "$fgrep_status" ;;
  791.       esac
  792.       set +e
  793.       cmp -s "$ldsoconf.dpkg-tmp" "$ldsoconf"
  794.       cmp_status=$?
  795.       set -e
  796.       case $cmp_status in
  797.         0) rm "$ldsoconf.dpkg-tmp" ;; # files are identical
  798.         1) mv "$ldsoconf.dpkg-tmp" "$ldsoconf" ;; # files differ
  799.         *) die "error comparing \"$ldsoconf.dpkg-tmp\" to \"$ldsoconf\";" \
  800.           "cmp exited with status $cmp_status" ;;
  801.       esac
  802.     fi
  803.   fi
  804. }
  805.  
  806. make_symlink_sane () {
  807.   # syntax: make_symlink_sane symlink target
  808.   #
  809.   # Ensure that the symbolic link symlink exists, and points to target.
  810.   #
  811.   # If symlink does not exist, create it and point it at target.
  812.   #
  813.   # If symlink exists but is not a symbolic link, back it up.
  814.   #
  815.   # If symlink exists, is a symbolic link, but points to the wrong location, fix
  816.   # it.
  817.   #
  818.   # If symlink exists, is a symbolic link, and already points to target, do
  819.   # nothing.
  820.   #
  821.   # This function wouldn't be needed if ln had an -I, --idempotent option.
  822.  
  823.   # Validate arguments.
  824.   if [ $# -ne 2 ]; then
  825.     usage_error "make_symlink_sane() called with wrong number of arguments;" \
  826.       "expected 2, got $#"
  827.     exit $SHELL_LIB_USAGE_ERROR
  828.   fi
  829.  
  830.   # We could just use the positional parameters as-is, but that makes things
  831.   # harder to follow.
  832.   local symlink target
  833.  
  834.   symlink="$1"
  835.   target="$2"
  836.  
  837.   if [ -L "$symlink" ] && [ "$(readlink "$symlink")" = "$target" ]; then
  838.       observe "link from $symlink to $target already exists"
  839.   else
  840.     observe "creating symbolic link from $symlink to $target"
  841.     mkdir -p "${target%/*}" "${symlink%/*}"
  842.     ln -s -b -S ".dpkg-old" "$target" "$symlink"
  843.   fi
  844. }
  845.  
  846. migrate_dir_to_symlink () {
  847.   # syntax: migrate_dir_to_symlink old_location new_location
  848.   #
  849.   # Per Debian Policy section 6.5.4, "A directory will never be replaced by a
  850.   # symbolic link to a directory or vice versa; instead, the existing state
  851.   # (symlink or not) will be left alone and dpkg will follow the symlink if
  852.   # there is one."
  853.   #
  854.   # We have to do it ourselves.
  855.   #
  856.   # This function moves the contents of old_location, a directory, into
  857.   # new_location, a directory, then makes old_location a symbolic link to
  858.   # new_location.
  859.   #
  860.   # old_location need not exist, but if it does, it must be a directory (or a
  861.   # symlink to a directory).  If it is not, it is backed up.  If new_location
  862.   # exists already and is not a directory, it is backed up.
  863.   #
  864.   # This function should be called from a package's preinst so that other
  865.   # packages unpacked after this one --- but before this package's postinst runs
  866.   # --- are unpacked into new_location even if their payloads contain
  867.   # old_location filespecs.
  868.  
  869.   # Validate arguments.
  870.   if [ $# -ne 2 ]; then
  871.     usage_error "migrate_dir_to_symlink() called with wrong number of"
  872.                 "arguments; expected 2, got $#"
  873.     exit $SHELL_LIB_USAGE_ERROR
  874.   fi
  875.  
  876.   # We could just use the positional parameters as-is, but that makes things
  877.   # harder to follow.
  878.   local new old
  879.  
  880.   old="$1"
  881.   new="$2"
  882.  
  883.   # Is old location a symlink?
  884.   if [ -L "$old" ]; then
  885.     # Does it already point to new location?
  886.     if [ "$(readlink "$old")" = "$new" ]; then
  887.       # Nothing to do; migration has already been done.
  888.       observe "migration of $old to $new already done"
  889.       return 0
  890.     else
  891.       # Back it up.
  892.       warn "backing up symbolic link $old as $old.dpkg-old"
  893.       mv -b "$old" "$old.dpkg-old"
  894.     fi
  895.   fi
  896.  
  897.   # Does old location exist, but is not a directory?
  898.   if [ -e "$old" ] && ! [ -d "$old" ]; then
  899.       # Back it up.
  900.       warn "backing up non-directory $old as $old.dpkg-old"
  901.       mv -b "$old" "$old.dpkg-old"
  902.   fi
  903.  
  904.   observe "migrating $old to $new"
  905.  
  906.   # Is new location a symlink?
  907.   if [ -L "$new" ]; then
  908.     # Does it point the wrong way, i.e., back to where we're migrating from?
  909.     if [ "$(readlink "$new")" = "$old" ]; then
  910.       # Get rid of it.
  911.       observe "removing symbolic link $new which points to $old"
  912.       rm "$new"
  913.     else
  914.       # Back it up.
  915.       warn "backing up symbolic link $new as $new.dpkg-old"
  916.       mv -b "$new" "$new.dpkg-old"
  917.     fi
  918.   fi
  919.  
  920.   # Does new location exist, but is not a directory?
  921.   if [ -e "$new" ] && ! [ -d "$new" ]; then
  922.     warn "backing up non-directory $new as $new.dpkg-old"
  923.     mv -b "$new" "$new.dpkg-old"
  924.   fi
  925.  
  926.   # Create new directory if it does not yet exist.
  927.   if ! [ -e "$new" ]; then
  928.     observe "creating $new"
  929.     mkdir -p "$new"
  930.   fi
  931.  
  932.   # Copy files in old location to new location.  Back up any filenames that
  933.   # already exist in the new location with the extension ".dpkg-old".
  934.   observe "copying files from $old to $new"
  935.   if ! (cd "$old" && cp -a -b -S ".dpkg-old" . "$new"); then
  936.     die "error(s) encountered while copying files from $old to $new"
  937.   fi
  938.  
  939.   # Remove files at old location.
  940.   observe "removing $old"
  941.   rm -r "$old"
  942.  
  943.   # Create symlink from old location to new location.
  944.   make_symlink_sane "$old" "$new"
  945. }
  946.  
  947. # vim:set ai et sw=2 ts=2 tw=80:
  948.  
  949. # GOBSTOPPER: The X Strike Force shell library ends here.
  950.  
  951. case "$1" in
  952. abort-install|abort-upgrade)
  953.   if dpkg --compare-versions "$2" lt-nl "1:7.4~2ubuntu1"; then
  954.     remove_conffile_rollback "/etc/X11/Xsession.d/20xorg-common_process-args"
  955.     remove_conffile_rollback "/etc/X11/Xsession.d/30xorg-common_xresources"
  956.     remove_conffile_rollback "/etc/X11/Xsession.d/50xorg-common_determine-startup"
  957.     remove_conffile_rollback "/etc/X11/Xsession.d/90xorg-common_ssh-agent"
  958.     remove_conffile_rollback "/etc/X11/Xsession.d/99xorg-common_start"
  959.   fi
  960. esac
  961.  
  962. # clean up non-conffile configuration files and related materials on purge
  963. if [ "$1" = "purge" ]; then
  964.   # de-register this package as a handler of the X server wrapper config file
  965.   if [ -e "$XWRAPPER_CONFIG_ROSTER" ]; then
  966.     # check existing roster file for our package name
  967.     if fgrep -qx "$THIS_PACKAGE" "$XWRAPPER_CONFIG_ROSTER" 2>/dev/null; then
  968.       # construct temporary roster file with our package name removed, ignoring
  969.       # failure
  970.       fgrep -vx "$THIS_PACKAGE" "$XWRAPPER_CONFIG_ROSTER" > \
  971.         "$XWRAPPER_CONFIG_ROSTER.dpkg-tmp" 2>/dev/null || true
  972.       # is there anything left?
  973.       if [ -s "$XWRAPPER_CONFIG_ROSTER.dpkg-tmp" ]; then
  974.         # yes, replace the roster file
  975.         mv "$XWRAPPER_CONFIG_ROSTER.dpkg-tmp" "$XWRAPPER_CONFIG_ROSTER"
  976.       else
  977.         # no; remove both the roster and our temporary copy
  978.         rm -f "$XWRAPPER_CONFIG_ROSTER" "$XWRAPPER_CONFIG_ROSTER.dpkg-tmp"
  979.         # remove X server wrapper config file if it was still managed by the
  980.         # package
  981.         if [ -e "$XWRAPPER_CONFIG_CHECKSUM" ]; then
  982.           # does it exist?
  983.           if [ -e "$XWRAPPER_CONFIG" ]; then
  984.             # does the current MD5 checksum match the stored checksum?
  985.             if [ "$(md5sum "$XWRAPPER_CONFIG")" \
  986.                  = "$(cat "$XWRAPPER_CONFIG_CHECKSUM")" ]; then
  987.               # yes; remove the config file
  988.               rm -f "$XWRAPPER_CONFIG"
  989.             fi
  990.           fi
  991.           # remove the checksum file; any remaining X server wrapper config file
  992.           # still on the system at this point is no longer being managed (local
  993.           # user customization)
  994.           rm -f "$XWRAPPER_CONFIG_CHECKSUM"
  995.         fi
  996.       fi
  997.     fi
  998.   fi
  999.  
  1000.   for DIR in "$CONFIG_DIR" "$CONFIG_AUX_DIR"; do
  1001.       rmdir "$DIR" 2> /dev/null || true
  1002.   done
  1003. fi
  1004.  
  1005. # Automatically added by dh_installdebconf
  1006. if [ "$1" = purge ] && [ -e /usr/share/debconf/confmodule ]; then
  1007.     . /usr/share/debconf/confmodule
  1008.     db_purge
  1009. fi
  1010. # End automatically added section
  1011. # Automatically added by dh_installinit
  1012. if [ "$1" = "purge" ] ; then
  1013.     update-rc.d x11-common remove >/dev/null || exit $?
  1014. fi
  1015. # End automatically added section
  1016.  
  1017.  
  1018. exit 0
  1019.  
  1020. # vim:set ai et sts=2 sw=2 tw=80:
  1021.